/**
 * 全面学习脚本 v3.0
 * 学习整个项目：源码(.h/.cpp)、BUILD.gn、测试、Mock、以及它们之间的关系
 */

const path = require('path');
const fs = require('fs');

const OH_CODE_PATH = process.env.OHCODE_PATH || process.argv[2] || 'C:/AI_Dev/HarmonyPilot_5764/OHCode';

async function main() {
    console.log('🎓 OpenHarmony 全面学习系统 v3.0');
    console.log('============================================\n');
    
    if (!fs.existsSync(OH_CODE_PATH)) {
        console.error(`❌ 错误：OHCode 目录不存在: ${OH_CODE_PATH}`);
        process.exit(1);
    }
    
    console.log(`📂 OHCode 目录: ${OH_CODE_PATH}\n`);
    
    console.log('📚 本次将全面深度学习：');
    console.log('  ✅ 整个项目的源码文件（.h, .cpp）');
    console.log('  ✅ 所有 BUILD.gn 文件及其配置');
    console.log('  ✅ test/unittest 目录的完整内容');
    console.log('  ✅ 测试文件（_test.cpp）的内容和模式');
    console.log('  ✅ Mock 文件的完整内容和模式');
    console.log('  ✅ 头文件与实现文件的关系');
    console.log('  ✅ 测试文件与被测文件的关系');
    console.log('  ✅ Mock 与原始类的关系');
    console.log('  ✅ BUILD.gn 与源码的关系');
    console.log('  ✅ 包含关系图（谁include了谁）');
    console.log('  ✅ 依赖关系图（BUILD.gn的deps）\n');
    
    try {
        const { ComprehensiveIndexer } = require('../out/core/knowledge/ComprehensiveIndexer');
        
        console.log('🚀 开始全面学习...');
        console.log('⏰ 预计需要 5-10 分钟（取决于代码量）\n');
        
        const startTime = Date.now();
        
        const indexer = new ComprehensiveIndexer(OH_CODE_PATH);
        await indexer.comprehensiveLearn();
        
        // 保存全面知识
        const savePath = 'core/knowledge/comprehensive-knowledge.json';
        await indexer.save(savePath);
        
        const duration = Math.round((Date.now() - startTime) / 1000);
        
        console.log(`\n✅ 全面学习完成！总耗时: ${duration} 秒 (${Math.round(duration / 60)} 分钟)`);
        
        // 显示统计
        const knowledge = indexer.getComprehensiveKnowledge();
        
        console.log('\n📊 学习成果统计：\n');
        
        console.log('【项目结构】');
        console.log(`  - 工程数: ${knowledge.projectStructures.length}`);
        let totalHeaders = 0, totalImpls = 0, totalBuildFiles = 0;
        knowledge.projectStructures.forEach((p) => {
            totalHeaders += p.sourceFiles.headers.length;
            totalImpls += p.sourceFiles.impls.length;
            totalBuildFiles += p.buildFiles.length;
        });
        console.log(`  - 头文件 (.h): ${totalHeaders}`);
        console.log(`  - 实现文件 (.cpp): ${totalImpls}`);
        console.log(`  - BUILD.gn: ${totalBuildFiles}`);
        
        console.log('\n【源码模式】');
        console.log(`  - 头文件模式: ${knowledge.headerPatterns.length}`);
        console.log(`  - 实现文件模式: ${knowledge.implPatterns.length}`);
        
        console.log('\n【测试目录】');
        let totalTestModules = 0;
        knowledge.projectStructures.forEach((p) => {
            totalTestModules += p.testDirs.length;
        });
        console.log(`  - 测试模块: ${totalTestModules}`);
        
        console.log('\n【Mock 模式】');
        console.log(`  - Mock 文件: ${knowledge.mockPatterns.length}`);
        console.log(`  - Mock-目标关系: ${knowledge.mockTargetRelations.length}`);
        
        console.log('\n【文件关系】');
        console.log(`  - 头文件-实现文件关系: ${knowledge.headerImplRelations.length}`);
        console.log(`  - 测试-被测关系: ${knowledge.testTargetRelations.length}`);
        console.log(`  - 包含关系: ${knowledge.includeGraph.length}`);
        console.log(`  - 依赖关系: ${knowledge.dependencyGraph.length}`);
        
        console.log('\n🎯 知识库可用于：');
        console.log('  ✅ 理解项目完整结构');
        console.log('  ✅ 找到被测文件及其头文件');
        console.log('  ✅ 生成正确的 #include 语句');
        console.log('  ✅ 创建合适的 Mock 类');
        console.log('  ✅ 配置准确的 BUILD.gn');
        console.log('  ✅ 理解代码依赖关系');
        console.log('  ✅ 生成高质量的测试代码');
        
        console.log(`\n📁 知识库位置: ${savePath}`);
        console.log('💡 这是最全面的知识库，建议配合其他知识库一起使用！');
        
    } catch (error) {
        console.error('\n❌ 全面学习失败:', error);
        console.error(error.stack);
        console.error('\n💡 故障排查:');
        console.error('   1. 确保已编译: npm run compile');
        console.error('   2. 检查 OHCode 目录结构');
        console.error('   3. 确保有足够的内存');
        process.exit(1);
    }
}

main().catch(error => {
    console.error('脚本执行失败:', error);
    process.exit(1);
});

